<--- %%NOBANNER%% --> crindex.sas
 BackForward

/*-------------------<---Start of Description-->---------------------\
| PURPOSE: creates index, simple or composite, if it does not exist  |
|        : Checks whether the variables entered by the user exist    |
|        : in the data set. It exits with a message if one of the    |
|        : vars entered by the user does not exist in the data set   |
| USAGE  : %crindex(lr,ds,vars)                                      |
|---------------------<---End of Description-->----------------------|
|--------------------------------------------------------------------|
|------------<---Start of Files or Arguments Needed-->---------------|
| Auguments and Variables:                                           |
|      lr      : libref                                              |
|      ds      : data set name                                       |
|      vars    : vars to index; vars separated by spaces             |
|      varscom : vars separated by commas, not spaces                |
|      indxname: name of the index to create                         |
|      ixnames : list of existing indexes on the data set            |
|      _i_       : counter                                           |
|      v       : one of the vars variables                           |
|-------------<---End of Files or Arguments Needed-->----------------|
|--------------------------------------------------------------------|
|------------------<---Start of Files Created-->---------------------|
| Example: %crindex(sasuser,class,race)                              |
|          %crindex(sasuser,class,race sex ed)                       |
|          %crindex(sasuser,class,race sex ede)                      |
| Usage:   %crindex(libname=,indata=,vars=, outdata=&indata);        |
\-------------------<---End of Files Created-->---------------------*/
%macro crindex(libname=,indata=,vars=, outdata=&indata);
/*--------------------------------------------\
| Author:  Duo Zhou;                          |
| Created: 8-27-2001 9:30pm;                  |
| Purpose: Create index of variables in a     |
|          dataset;                           |
\--------------------------------------------*/
 %*-- %put libname=&libname indata=&indata vars=&vars;
 %local indxname ixnames _i_ varscom;
  %let libname=%upcase(&libname);
 %let indata=%upcase(&indata);
 %let vars=%upcase(&vars);
 %if &outdata eq %then %do;
   %let outdata=&indata;
 %end;
 %*-------- Check if var exists in the data set;
 %*--------  and generate a name for the simple/composite index;
 proc sql noprint;
   select name into :allv separated by " "
     from dictionary.columns
     where libname="&libname" and memname="&indata"
   ;
 quit;
 %put ........................ allv=&allv;
 %let indxname=;
 %let _i_=1;
 %let v=%qscan(&vars,&_i_);
 %do %while(%length(&v) gt 0);
   %if %sysfunc(indexw(&allv,&v)) eq 0 %then %do;
     %put .............. &v does not exist in the data set: &libname..&indata;
     %put .............. Exiting this program;
     %goto finish;
   %end;
   %let indxname=&indxname.%substr(&v,1,1);
   %put indxname=&indxname;
   %let _i_=%eval(&_i_+1);
   %let v=%scan(&vars,&_i_);
   %if &_i_>8 %then %let v=;
 %end;
 %if &_i_=2 %then %let indxname=&vars;
 %*-- Check if index already exists;
 %let ixnames=;
 proc sql noprint;
  select distinct indxname into :ixnames separated by " "
   from dictionary.indexes
   where libname="&libname" and memname="&indata"
  ;
 quit;
 %*--- %put Existing indexes are:       &ixnames;
 %*--- %put Name of index to create is: &indxname;
 %if %index(&ixnames, %upcase(&indxname))=0 %then
  %do;
    %*--- %put index &indxname does not exist;
    %*-- introduce commas into vars to get varscom;
    %let varscom=%sysfunc(translate(&vars,","," "));
    %put ................. vars=&vars;
    %put ................. varscom=&varscom;
    proc sql noprint;
      create index &indxname on &libname..&outdata(&varscom);
      %put --> Note: Index created: &indxname.. ;
    quit;
  %end;
 %else %put --> Note: Index &indxname already exists! ;
 %finish:
%mend crindex;